/* arch/i386/include/arch/io.h  
 * 
 * This file is part of xnix. 
 * 
 * XNIX is free software: you can redistribute it and/or modify 
 * it under the terms of the GNU General Public License as published by 
 * the Free Software Foundation, either version 3 of the License, or 
 * (at your option) any later version. 
 * 
 * XNIX is distributed in the hope that it will be useful, 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
 * GNU General Public License for more details. 
 * 
 * You should have received a copy of the GNU General Public License 
 * along with XNIX. If not, see <https://www.gnu.org/licenses/>
 */ 




#ifndef ARCH_IO_H
#define ARCH_IO_H


#ifndef __ASSEMBLER__

/* we can use assembly here! yeah! */

#define inb(port) ({								\
		__uint8_t _r;							\
		__asm__ volatile ("inb %%dx, %%al" : "=a" (_r) : "d" ((port)));	\
		_r;								\
	})


#define outb(val, port) __asm__ volatile ("outb %%al, %%dx" :: "a" ((val)), "d" ((port)))


#define inw(port) ({								\
		__uint16_t _r;							\
		__asm__ volatile ("inw %%dx, %%ax" : "=a" (_r) : "d" ((port))); \
		_r;								\
	})

#define outw(val, port) __asm__ volatile ("outw %%ax, %%dx" :: "a" ((val)), "d" ((port)))


#define inl(port) ({								\
		__uint32_t _r;							\
		__asm__ volatile ("inl %%dx, %%eax" : "=a" (_r) : "d" ((port)));\
		_r;								\
	})

#define outl(val, port) __asm__ volatile ("outl %%eax, %%dx" :: "a" ((val)), "d" ((port)))

#endif

#endif
